package com.fufufu.mail.product.service.impl;

import com.fufufu.mail.product.entity.AttrEntity;
import com.fufufu.mail.product.service.AttrService;
import com.fufufu.mail.product.vo.BaseAttrs;
import com.fufufu.mail.product.vo.ProductAttrValueUpdateVo;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fufufu.common.utils.PageUtils;
import com.fufufu.common.utils.Query;

import com.fufufu.mail.product.dao.ProductAttrValueDao;
import com.fufufu.mail.product.entity.ProductAttrValueEntity;
import com.fufufu.mail.product.service.ProductAttrValueService;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;


@Service("productAttrValueService")
public class ProductAttrValueServiceImpl extends ServiceImpl<ProductAttrValueDao, ProductAttrValueEntity> implements ProductAttrValueService {

    @Resource
    private AttrService attrService;



    @Override
    public List<ProductAttrValueEntity> queryListBySpuId(Long spuId) {
        return this.baseMapper.selectList(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id", spuId));
    }

    @Transactional
    @Override
    public void updateAttrValueBySpuId(Long spuId, List<ProductAttrValueUpdateVo> vos) {
        List<ProductAttrValueEntity> productAttrValueEntities = vos.stream().map((vo) -> {
            ProductAttrValueEntity productAttrValueEntity = new ProductAttrValueEntity();
            BeanUtils.copyProperties(vo, productAttrValueEntity);
            productAttrValueEntity.setSpuId(spuId);
            return productAttrValueEntity;
        }).collect(Collectors.toList());
        // 这里的逻辑在于null的修改，如果把一个属性的值修改成null，那么直接更新的话这个值是不会变成null的，所以使用直接删除然后再新增
        // 但是这种删除插入需要的主键没有被引用的情况下用，不然主键被引用了的话会导致同一变的很麻烦，需要获取所有的主键，然后对引用了主键
        // 的其它表中的该主键字段进行修改
        this.baseMapper.delete(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id", spuId));
        this.saveBatch(productAttrValueEntities);
    }

    @Override
    public void saveAttrBySpuId(Long spuId, List<BaseAttrs> baseAttrs) {
        if (spuId == null || baseAttrs == null || baseAttrs.size() == 0) {
            return;
        }
        List<Long> ids = new ArrayList<>();
        Map<Long, ProductAttrValueEntity> map = new HashMap<>();
        List<ProductAttrValueEntity> valueEntities = baseAttrs.stream().map((attr) -> {
            ProductAttrValueEntity valueEntity = new ProductAttrValueEntity();
            valueEntity.setSpuId(spuId);
            valueEntity.setAttrValue(attr.getAttrValues());
            valueEntity.setAttrId(attr.getAttrId());
            valueEntity.setQuickShow(attr.getShowDesc());
            // 将id和ProductAttrValueEntity进行对应，加快后面名字设置的速度
            map.put(attr.getAttrId(), valueEntity);
            // 获取所有addr的id，用于后面查数据库获取名字
            ids.add(attr.getAttrId());
            return valueEntity;
        }).collect(Collectors.toList());
        // 这样就不用循环查数据库了
        List<AttrEntity> entities = attrService.getBaseMapper().selectBatchIds(ids);
        for (AttrEntity entity : entities) {
            map.get(entity.getAttrId()).setAttrName(entity.getAttrName());
        }
        this.saveBatch(valueEntities);
    }

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<ProductAttrValueEntity> page = this.page(
                new Query<ProductAttrValueEntity>().getPage(params),
                new QueryWrapper<ProductAttrValueEntity>()
        );

        return new PageUtils(page);
    }

}